#include "taskqueue.h"
#include <QDebug>

// 声明这个已经实例化的静态成员
TaskQueue TaskQueue::m_queue;

TaskQueue *TaskQueue::getInstance()
{
    return &m_queue;
}

void TaskQueue::addTask(Task &t)
{
    // 任务添加到任务队列中
    m_mutex.lock();
    m_taskQ.enqueue(t);
    m_mutex.unlock();
    // 如果消费者阻塞了, 唤醒消费者
    m_cond.wakeAll();
}

void TaskQueue::addTask(callback func, void *arg)
{
    Task t;
    // 任务添加到任务队列中
    m_mutex.lock();
    t.arg = arg;
    t.function = func;
    m_taskQ.enqueue(t);
    m_mutex.unlock();
    // 如果消费者阻塞了, 唤醒消费者
    m_cond.wakeAll();
}


Task TaskQueue::takeTask()
{
    Task t;
    m_mutex.lock();
    // 取出一个有效的任务, 如果没有任务使用条件变量阻塞这个线程
    while(1)
    {
        if(m_taskQ.size() > 0)
        {
            // 取出有效的任务, 跳出循环体
            t = m_taskQ.dequeue();
            break;
        }
        else
        {
            // 没有任务了, 阻塞线程
            qDebug() << "任务队列中没有任务了, 强迫线程阻塞...";
            m_cond.wait(&m_mutex);
            qDebug() << "添加了新的任务, 解除阻塞, 从任务队列中取新的任务...";
        }
    }
    m_mutex.unlock();
    return t;
}

int TaskQueue::taskNumber()
{
    return m_taskQ.size();
}

TaskQueue::TaskQueue()
{
}
